import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'

/**
 * API请求工具类
 * 配置基础URL为http://localhost:8001/api
 */
class ApiRequest {
  private instance: AxiosInstance

  constructor(baseURL: string = 'http://localhost:8001/api') {
    // 创建axios实例
    this.instance = axios.create({
      baseURL,
      timeout: 15000, // 请求超时时间
      headers: {
        'Content-Type': 'application/json'
      }
    })

    // 请求拦截器
    this.instance.interceptors.request.use(
      (config) => {
        // 从localStorage获取token
        const token = localStorage.getItem('token')
        if (token) {
          config.headers.Authorization = `Bearer ${token}`
        }
        return config
      },
      (error) => {
        return Promise.reject(error)
      }
    )

    // 响应拦截器
    this.instance.interceptors.response.use(
      (response: AxiosResponse) => {
        // 如果返回的是二进制数据，直接返回
        if (response.config.responseType === 'blob') {
          return response
        }
        
        // 统一处理响应数据
        const { data } = response
        if (data.code === 0) {
          return data.data
        } else {
          // 业务错误
          return Promise.reject(new Error(data.message || '请求失败'))
        }
      },
      (error) => {
        // HTTP错误处理
        if (error.response) {
          switch (error.response.status) {
            case 401:
              // 未授权，清除token并跳转到登录页
              localStorage.removeItem('token')
              window.location.href = '/login'
              break
            case 403:
              console.error('没有权限访问')
              break
            case 404:
              console.error('请求的资源不存在')
              break
            case 500:
              console.error('服务器错误')
              break
            default:
              console.error('请求失败', error)
          }
        } else if (error.request) {
          // 请求已发出，但没有收到响应
          console.error('网络错误，请检查您的网络连接')
        } else {
          // 在设置请求时发生错误
          console.error('请求配置错误', error.message)
        }
        return Promise.reject(error)
      }
    )
  }

  /**
   * GET请求
   * @param url 请求地址
   * @param params 请求参数
   * @param config 额外配置
   */
  get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.get(url, { params, ...config })
  }

  /**
   * POST请求
   * @param url 请求地址
   * @param data 请求数据
   * @param config 额外配置
   */
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.post(url, data, config)
  }

  /**
   * PUT请求
   * @param url 请求地址
   * @param data 请求数据
   * @param config 额外配置
   */
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.put(url, data, config)
  }

  /**
   * DELETE请求
   * @param url 请求地址
   * @param params 请求参数
   * @param config 额外配置
   */
  delete<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.delete(url, { params, ...config })
  }

  /**
   * 上传文件
   * @param url 请求地址
   * @param formData 表单数据
   * @param config 额外配置
   */
  upload<T = any>(url: string, formData: FormData, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      ...config
    })
  }

  /**
   * 下载文件
   * @param url 请求地址
   * @param params 请求参数
   * @param filename 文件名
   */
  download(url: string, params?: any, filename?: string): Promise<void> {
    return this.instance.get(url, {
      params,
      responseType: 'blob'
    }).then(response => {
      const blob = new Blob([response.data])
      const link = document.createElement('a')
      link.href = URL.createObjectURL(blob)
      link.download = filename || 'download'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      URL.revokeObjectURL(link.href)
    })
  }
}

// 创建API请求实例
export const api = new ApiRequest()

// 导出默认实例
export default api